const { decrypt } = require('../helper/util');
const idMap = {};
const ioMap = {};

/**
 * @apiDefine ErrorResponse
 * @apiError (请求错误) {String} err_message 错误信息描述
 */

/**
 * @apiVersion 1.0.0
 * @apiGroup  通知
 * @api {WS} notify 通知通道
 * @apiName /notify
 * @apiExample {js} socket.io-client 例子:
 *  import socket from 'socket.io-client';
 *  
 *  const notify = socket.connect('ws://localhost:8080/notify');
 *  
 *  notify.on('connect', () => {
 *    // 连接成功, 可以在这里面监听或者触发事件;
 *  });
 */

/**
 * @apiVersion 1.0.0
 * @apiGroup  通知
 * @api {WS} / 触发 join 事件
 * @apiName join
 * @apiExample {js} socket.io-client 例子:
 *  import socket from 'socket.io-client';
 *  
 *  const notify = socket.connect('ws://localhost:8080/notify');
 *  
 *  // 连接成功, 可以在这里面监听或者触发事件;
 *  notify.on('connect', () => {
 *    // 触发 join 事件，目的是通知服务端连接就绪，可以接受通知了;
 *    notify.emit('join', { token });
 *  });
 * @apiParam {String} token 用户令牌
 */

/**
 * @apiVersion 1.0.0
 * @apiGroup  通知
 * @api {WS} / 监听 ok 事件
 * @apiName ok
 * @apiExample {js} socket.io-client 例子:
 *  import socket from 'socket.io-client';
 *  
 *  const notify = socket.connect('ws://localhost:8080/notify');
 *  
 *  // 连接成功, 可以在这里面监听或者触发事件;
 *  notify.on('connect', () => {
 *    // 服务端接受到客户端的 join 事件后，会往客户端发送 ok 事件，代表服务端已经知晓了客户端的加入；
 *    notify.on('ok', (data) => {});
 *  });
 * @apiParam (数据) {Null} data 没有数据
 */

/**
 * @apiVersion 1.0.0
 * @apiGroup  通知
 * @api {WS} / 监听 message 事件
 * @apiName message
 * @apiExample {js} socket.io-client 例子:
 *  import socket from 'socket.io-client';
 *  
 *  const notify = socket.connect('ws://localhost:8080/notify');
 *  
 *  // 连接成功, 可以在这里面监听或者触发事件;
 *  notify.on('connect', () => {
 *    // 通知的通道有新消息时会触发 message 时间，客户端监听 message 事件可以在事件回调函数中获取数据
 *    notify.on('message', (data) => {});
 *  });
 * @apiParam (数据) {Number} kind 消息类型: 1 有人申请添加好友
 * @apiParam (数据) {Object} data 消息主体
 */

exports.getNotifyID = () => idMap;
exports.getNotifyIO = () => ioMap;
exports.socketHandle = (socket) => {
  // 用户进入时保留用户的连接 id;
  socket.on('join', data => {
    const userid = decrypt('user', data.token);

    idMap[userid] = socket.id;
    ioMap[userid] = socket;
    
    socket.emit('ok');
  });

  // 连接断开时将用户踢出 map
  socket.on('disconnect', () => {
    for (let key in idMap) {
      if (idMap[key] === socket.id) {
        idMap[key] = null;
      }
    }
  });
  // socket.on('message', data => {
  //   const socketID = idMap[data.toUserID];
  //   const fromUserID = decrypt('user', data.token);

  //   // 如果要发送给消息的用户在 map 中直接发送消息，不在则不发
  //   if (!socketID) return;

  //   if (data.kind === 1) {
  //     socket.broadcast.to(socketID).emit('message', {
  //       fromUserID: fromUserID,
  //       kind: data.kind, // 1 申请添加好友
  //       data: data,
  //     });
  //   }
  // });
};


